#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* ---------- 此处定义见小白专场 -------------- */
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1
/* ---------- 此处定义见小白专场 -------------- */
struct TreeNode
{
    ElementType Element;
    Tree Left;
    Tree Right;
} T1[MaxTree], T2[MaxTree];
//在这里直接定义除了T1,T2两个树

//构建树结构
Tree BuildTree(struct TreeNode T[]);
bool Isomorphic(Tree R1, Tree R2);
//判断是否同构

int main()
{
    Tree R1, R2;
    R1 = BuildTree(T1);
    R2 = BuildTree(T2);
    if(Isomorphic(R1,R2))
        printf("Yes\n");
    else
        printf("No\n");
    return 0;
}

Tree BuildTree(struct TreeNode T[])
{
    int i,N=0,check[MaxTree];//Tree的大小
    char cl, cr;//临时存储输入字符
    Tree Root = Null;
    scanf("%d\n", &N);
    if (N)
    {
        //用来检查根在哪里
        for (i = 0; i < N; i++)
            check[i] = 0;
        for (i = 0; i < N; i++)
        {
            scanf("%c %c %c\n", &T[i].Element, &cl, &cr);
            if(cl!='-')
            {
                T[i].Left = cl - '0';
                check[T[i].Left] = 1;//也就是说Left是有人指向的 对应的那个人就不是根节点
            }
            else
                T[i].Left = Null;

            if(cr!='-')
            {
                T[i].Right = cr - '0';
                check[T[i].Right] = 1;//也就是说Left是有人指向的 对应的那个人就不是根节点
            }
            else
                T[i].Right = Null;
        }
        for (i = 0; i < N ; i++)
            if (!check[i])
                break;
        Root = i;
    }
    return Root;
}
bool Isomorphic(Tree R1, Tree R2)
{
    if(R1==Null &&R2==Null)//都是空的
        return true;
    else if((R1==Null&&R2!=Null) || (R2==Null&&R1!=Null))//一方为空 另一方不为空
        return false;
    else if(T1[R1].Element != T2[R2].Element)//根节点的内容不相同 是交换左右子树无法实现的
        return false;
    else if(T1[R1].Left == Null && T2[R2].Left ==Null)//同时没有左子树了 则对比双方的右子树
        return Isomorphic(T1[R1].Right, T2[R2].Right);
    
    if((T1[R1].Left != Null && T2[R2].Left != Null) && (T1[T1[R1].Left].Element == T2[T2[R2].Left].Element))
    //左子树不为空，对比左边元素相同情况下继续深挖，需要同时左值=左值，右值=右值
        return Isomorphic(T1[R1].Left, T2[R2].Left) && Isomorphic(T1[R1].Right, T2[R2].Right);
    else
    //左子树
        return Isomorphic(T1[R1].Right, T2[R2].Left) && Isomorphic(T1[R1].Left, T2[R2].Right);
}